package com.collabscm.waf.util;

import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

import com.collabscm.waf.solution.logging.Logger;
import com.collabscm.waf.solution.logging.LoggerFactory;

/**
 * 系统常量工具类，此为了解决常量分散在各个Java文件或JS文件中，甚至直接写死在代码中，此工具的目的
 * 就是为了能统一解决这些常量的问题，所有的常量都具体存放在数据库中，然后系统启动后将自动从数据库
 * 中将这些常量取出并初始系统内的各种常量，系统内的常量都统一调用此类提供的方法。
 *
 * @author Zeng Raoxing
 */
@DependsOn(ConstantUtils.constantProviderName)
@Component public class ConstantUtils {
	public static final Logger logger = LoggerFactory.getLogger(ConstantUtils.class);
	/**
	 * constantProvider的Service的名称
	 */
	public static final String constantProviderName = "constantProvider";
	/**
	 * 获得业务常量的取值
	 * 
	 * @param constantCategory 参数类型
	 * @param constantCode     参数代码
	 */
	public static Integer getConstant(String constantCategory, String constantCode) {
		return constantProvider.findConstant(constantCategory, constantCode);
	}
	
	private static ConstantProvider constantProvider;
	
	/**
	 * 常量提供者
	 *
	 * @author Zeng Raoxing
	 */
	public static abstract class ConstantProvider {
		
		public ConstantProvider() {
			constantProvider = this;
		}
		
		/**
		 * 得到具体的常量值，注意：在查找到之后需要参数删除，避免同样的参数在多处被引用。
		 * 
		 * @param constantCategory
		 * @param constantCode
		 */
		protected abstract Integer findConstant(String constantCategory, String constantCode);
		
	}
	
}
